package com.siteseat.common.security;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang3.StringEscapeUtils;

/**
 * 各种格式的编码加码工具类. 集成Commons-Codec,Commons-Lang及JDK提供的编解码方法
 */
public class EncodeHelper {

  private static final String DEFAULT_URL_ENCODING = "UTF-8";

  /**
   * Hex编码.
   * 
   * @param input
   * @return 编码了的文本
   */
  public static String hexEncode( byte[] input ) {
    return new String( Hex.encodeHex( input ) );
  }

  /**
   * Hex解码.
   * 
   * @param input
   * @return 解码了的文本
   */
  public static byte[] hexDecode( String input ) {
    try {
      return Hex.decodeHex( input.toCharArray() );
    } catch( DecoderException e ) {
      throw new IllegalStateException( "Hex Decoder exception", e );
    }
  }

  /**
   * Base64编码.
   * 
   * @param input
   * @return 编码了的文本
   */
  public static String base64Encode( byte[] input ) {
    return new String( Base64.encodeBase64( input ) );
  }

  /**
   * Base64编码, URL安全(将Base64中的URL非法字符如+,/=转为其他字符, 见RFC3548).
   * 
   * @param input
   * @return 编码了的文本
   */
  /*
   * public static String base64UrlSafeEncode(byte[] input) { return
   * Base64.encodeBase64URLSafeString(input); }
   */

  /**
   * Base64解码.
   * 
   * @param input
   * @return 解码了的字节数组
   */
  public static byte[] base64Decode( String input ) {
    return Base64.decodeBase64( input );
  }

  /**
   * URL 编码, Encode默认为UTF-8.
   * 
   * @param input
   * @return 编码了的URL
   */
  public static String urlEncode( String input ) {
    return urlEncode( input, EncodeHelper.DEFAULT_URL_ENCODING );
  }

  /**
   * URL 编码.
   * 
   * @param input
   * @param encoding
   * @return 编码了的URL
   */
  public static String urlEncode( String input, String encoding ) {
    try {
      return URLEncoder.encode( input, encoding );
    } catch( UnsupportedEncodingException e ) {
      throw new IllegalArgumentException( "Unsupported Encoding Exception", e );
    }
  }

  /**
   * URL 解码, Encode默认为UTF-8.
   * 
   * @param input
   * @return 解码了的URL
   */
  public static String urlDecode( String input ) {
    return urlDecode( input, EncodeHelper.DEFAULT_URL_ENCODING );
  }

  /**
   * URL 解码.
   * 
   * @param input
   * @param encoding
   * @return 解码了的URL
   */
  public static String urlDecode( String input, String encoding ) {
    try {
      return URLDecoder.decode( input, encoding );
    } catch( UnsupportedEncodingException e ) {
      throw new IllegalArgumentException( "Unsupported Encoding Exception", e );
    }
  }

  /**
   * Html 编码.
   * 
   * @param html
   * @return 编码了的Html
   */
  public static String htmlEscape( String html ) {
    return StringEscapeUtils.escapeHtml4( html );
  }

  /**
   * Html 解码.
   * 
   * @param htmlEscaped
   * @return 解码了的Html
   */
  public static String htmlUnescape( String htmlEscaped ) {
    return StringEscapeUtils.unescapeHtml4( htmlEscaped );
  }

  /**
   * Xml 编码.
   * 
   * @param xml
   * @return 编码了的XML
   */
  public static String xmlEscape( String xml ) {
    return StringEscapeUtils.escapeXml( xml );
  }

  /**
   * Xml 解码.
   * 
   * @param xmlEscaped
   * @return 解码了的XML
   */
  public static String xmlUnescape( String xmlEscaped ) {
    return StringEscapeUtils.unescapeXml( xmlEscaped );
  }
}
